# 没有使用函数的情况
# 举例：比较两个数的大小
"""
a = int(input("请输入数字"))
b = int(input("请输入数字"))
if a > b:
    print("最大的数是%s"%a)
elif a < b:
    print("最大的数是%s"%b)
"""
# 我想连续比对五组
"""
a = int(input("请输入数字"))
b = int(input("请输入数字"))
if a > b:
    print("最大的数是%s"%a)
elif a < b:
    print("最大的数是%s"%b)
    
a = int(input("请输入数字"))
b = int(input("请输入数字"))
if a > b:
    print("最大的数是%s"%a)
elif a < b:
    print("最大的数是%s"%b)
    
a = int(input("请输入数字"))
b = int(input("请输入数字"))
if a > b:
    print("最大的数是%s"%a)
elif a < b:
    print("最大的数是%s"%b)
    
a = int(input("请输入数字"))
b = int(input("请输入数字"))
if a > b:
    print("最大的数是%s"%a)
elif a < b:
    print("最大的数是%s"%b)
    
a = int(input("请输入数字"))
b = int(input("请输入数字"))
if a > b:
    print("最大的数是%s"%a)
elif a < b:
    print("最大的数是%s"%b)
"""
# 函数的作用就体现出来了，可以将重复性的工作，封装到一个方法里面，需要的时候就可以调用它
def max_num(a,b): # max_num 叫做函数的名字。 a,b 表示的这个函数形参，形式参数，你需要传递的
    """
    以下都是函数体
    """
    if a > b:
        print("最大的数是%s" % a)
    elif a < b:
        print("最大的数是%s" % b)
# 调用函数
"""
max_num(10,20)
max_num(20,10)
"""
# 一些我们经常使用到的内置函数
# 使用内置函数的方法： len()
"""
print(len("asdasd")) # 查看长度的内置函数
print(str("asdasd")) # 强转成字符串的内置函数
print(list("asdasd")) # 强转成列表的内置函数
print(tuple("asdasd")) # 强转成元组的内置函数
"""
# ....
# 标准库函数/原生库 ： 需要import 导入 才能使用的库
# 不需要你去安装的库，都是原生库
import json
import random
# 第三方库的函数
# 需要pip install <package> 安装成功的库，都叫做三方库

# 用户自定义的函数：我们自己去封装的函数，都是用户自定义函数
# 第一种自定义函数：有形参，无返回
def classinfo(name,age): # 有形参 : name
    if name == "1903" and age == 18:
        print("我们是1903班的")
    elif name == "2103":
        print("我们是2013班的")
    else:
        print("没有这个班级")
# result = classinfo(name = "1903",age = 18)
# print(result) # None，说明这个函数是没有返回的
# 第二种自定义函数：有形参，有返回
# todo：正例
def eat(foot):
    """
    有形参，有返回
    return后面的代码块，不会被执行
    当存在分支条件时，可以有多个return，因为再多的分支，也只会走一个
    有return的内容，可以在调用的时候，赋值，这样可以拿到它的返回值
    """
    if foot == "汉堡":
        print("我们中午吃的是汉堡")
        return "我们中午吃的是汉堡"
    elif foot == "可乐":
        return "我们中午喝的是可乐"
"""
result = eat("汉堡")
print(result)
"""
def eat1(foot):
    """
    有形参，有返回
    return后面的代码块，不会被执行
    """
    print("我们中午吃的是汉堡")
    return "我们中午吃的是汉堡包"
    print("我们中午吃的是汉堡")
# eat1("汉堡")
def eat2(foot):
    """
    有形参，有返回
    return后面的代码块，不会被执行
    如果有多个return，只会返回第一个
    """
    print(f"我们中午吃的是{foot}")
    return f"我们中午吃的是{foot}"
    return f"我们没吃{foot}"
# result = eat2("汉堡")
# print(result)
# 第三种自定义函数：没有形参，有返回/return
def get_studentinfo():
    return "王长帅，魏延旭"
# result = get_studentinfo()
# print(f"来测十九期班级有{result}")
#第四种自定义函数：无形参，无返回 return
def get_student():
    print("王长帅，魏延旭")
# result = get_student() # 王长帅，魏延旭
# print(result) # None
# 函数的作用域
a = 100 # 在函数体外定义了a 这个属于全局变量
str1 = "王长帅"  # 全局变量
def text():
    a = 3 # 在函数内，定义了a
    print("a = {}".format(a))# 如果函数体内和全局变量都有的话，会优先选择函数体的变量
    print(str1) # 如果函数体内没有这个变量，会找到全局变量
    # a = 10
    # print("a = {}".format(a))

# text() #
# print(a) # a的值会是多少？ 100

# 在函数体内，修改全局的变量
b = 200
def text1():
    global b #　引用全局变量
    b = 3
    print(b)
# text1()
# print(b) # 因为text1里面改掉了全局变量b的值，所以b现在为3

# 变量查找规则： 先从函数体寻找——>全局变量
c = 100 # 全局
word = "hello" # 全局
def text2():
    x = "hello" # 局部
    c = 10 #局部
    print("locals = {}，globals = {}".format(locals(),globals()))
# text2()
# 位置参数 ： 在函数调用时，默认按位置顺序进行传递
def f1(a,b,c):
    print(a,b,c)
# f1(10,20,30) # a = 10 ,b = 20 , c = 30
# f1(c = 200,b = 100,a = 20) #
# f1(10) # 如果参数少传递，就会报错，缺少实参
# 位置参数：给定默认实参
def f2(a,b = 200,c = 300):
    print(a,b,c)
# f2(100) # a = 100 b = 200 c = 300
# f2("王长帅","为延续","防御") # a = 王长帅  b = 为延续  c = 防御
# 不定长参数： *args
def f3(a,*b): # * 表示不定长参数的接收，它的返回结果是元组
    print(a,b)
f3(5,10,20,30,40,50,60,70,80,90,"王长帅","王不是很帅","王很帅吗？") # a = 5,b = all
# 不定长关键字参数：**kwargs
def f4(a,**b): # ** 表示不定长关键字参数的接收，它的返回结果是字典
    print(a,b)
f4(5,姓名="王长帅",年龄="26")
# 以下是错误的定义函数
def f5(*b,a): # 不定长参数，不要写在正常参数的前面，它一定要放到最后面
    print(b,a)
# f5(55,55,55,66,99)
f5(12345,15,123,4,a=5)











